package com.aura.springbook.model;

import com.aura.springbook.common.enums.UserRoleEnum;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;

import java.time.LocalDateTime;

/**
 * 用户实体类
 * <p>
 * 对应数据库表：user
 * <p>
 * 字段说明：
 * - id: 主键，自增
 * - username: 用户名（登录名），唯一
 * - password: 密码，加密存储
 * - realName: 真实姓名
 * - phone: 联系电话
 * - role: 用户角色（USER-普通用户，ADMIN-管理员）
 * - createTime: 创建时间，自动填充
 * - updateTime: 更新时间，自动填充
 */
@Data
@TableName("user")
public class User {

    /**
     * 数据库自增主键
     */
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;

    /**
     * 用户登录时使用的唯一标识，不能重复
     */
    @TableField("username")
    private String username;

    /**
     * 使用PasswordUtil进行加密存储，确保安全性
     */
    @TableField("password")
    private String password;

    /**
     * 用户的真实姓名信息
     */
    @TableField("real_name")
    private String realName;

    /**
     * 用户的联系电话，用于联系和通知
     */
    @TableField("phone")
    private String phone;

    /**
     * 默认为普通用户角色，可通过管理员接口修改
     */
    @TableField("role")
    private String role = UserRoleEnum.USER.getCode();

    /**
     * 记录用户账户的创建时间，由MyBatis-Plus自动填充
     */
    @TableField(value = "create_time", fill = FieldFill.INSERT)
    private LocalDateTime createTime;

    /**
     * 记录用户信息的最后更新时间，由MyBatis-Plus自动填充
     */
    @TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;

    /**
     * 获取用户角色枚举
     *
     * @return 用户角色枚举
     */
    public UserRoleEnum getRoleEnum() {
        try {
            return UserRoleEnum.fromCode(this.role);
        } catch (IllegalArgumentException e) {
            return UserRoleEnum.USER;
        }
    }

    /**
     * 设置用户角色  通过UserRoleEnum枚举设置用户角色
     *
     * @param roleEnum 用户角色枚举
     */
    public void setRoleEnum(UserRoleEnum roleEnum) {
        this.role = roleEnum.getCode();
    }

    /**
     * 检查用户角色是否为管理员
     *
     * @return 是否为管理员
     */
    public boolean isAdmin() {
        return UserRoleEnum.ADMIN.getCode().equals(this.role);
    }
}